Запрос к базе данных с передачей нескольких параметров rails

У меня есть таблица пользователей и таблица активности. У пользователя много действий. Это то, что у меня есть в моей таблице пользователей:

class SorceryCore < ActiveRecord::Migration
  def change
create_table :users do |t|
    t.string :first_name
    t.string :surname
    t.integer :previous_award
    t.integer :chosen_award
  t.string :email,            :null => false
  t.string :crypted_password
  t.string :salt

  t.timestamps
end

add_index :users, :email, unique: true
end

Это то, что у меня есть в моей таблице действий:

class CreateActivities < ActiveRecord::Migration
  def change
create_table :activities do |t|
  t.integer :activity_type
  t.string :activity_name
  t.string :approver_email
  t.references :users, index: true, foreign_key: true

  t.timestamps null: false
end
end

На мой взгляд, я хочу показать имя_активности, где user_id = идентификатор текущего пользователя, а где тип_активности = 1. Я не уверен, где написать этот метод или как его вызвать. Я прочитал следующую ссылку, но, похоже, ничего не работает. http://guides.rubyonrails.org/active_record_querying.html

Я думаю, что мне нужно использовать что-то вроде этого:

Activity.where("activity_type <= ?", 1).where("user_id <= ?", current_user.id)

Но я не уверен, что это должно быть в методе контроллера или модели, и я не уверен, в какой контроллер или модель он должен войти.


person javatar    schedule 30.01.2016    source источник


Ответы (2)


В модели пользователя:

# user.rb
def activity_by_type(type = 1)
  self.activities.where(activity_type: type).first
end

а затем вы можете позвонить current_user.activity_by_type(<specify the type here>)

Вы можете использовать описанный выше метод, чтобы получить любой тип действия для указанного пользователя, указав тип в вызове метода.

Однако я дам один совет: попробуйте использовать концепцию перечислений для классифицируйте свой столбец activity_type в таблице действий. Пример того, как можно найти здесь

person x6iae    schedule 30.01.2016
comment
Спасибо, но я, кажется, получаю сообщение об ошибке: неопределенный метод 'активность' - person javatar; 30.01.2016
comment
не подскажете откуда у вас эта ошибка? или полное сообщение об ошибке? Кроме того, я внес изменения в свой ответ. можете ли вы проверить, используете ли вы последнюю версию ответа? - person x6iae; 30.01.2016
comment
Ниже приведена ошибка терминала: Completed 500 Internal Server Error in 5ms (ActiveRecord: 0,1ms) ActionView::Template::Error (undefined method activity' for #<User:0x007ff60f0c0348>): 8: 9: <h1><%= current_user.setCommunity %></h1> 10: <h4><%= current_user.activity_by_type(1) %></h4> 11: 12: 13: <span><%= current_user.first_name %></span> app/models/user.rb:9:in activity_by_type' app/views/activities/community_home.html.erb:10:in `_app_views_activities_community_home_html_erb___3535737252128861553_48207347 ' - person javatar; 30.01.2016
comment
Спасибо за обновление, теперь я использую перечисления для классификации своих типов. У меня есть 3 типа личных, физических и общественных. Не совсем уверен, как это влияет на то, что я здесь делаю - как здесь могут помочь перечисления? Что касается ошибки, я совсем новичок в рельсах, поэтому я не очень понимаю ее. - person javatar; 30.01.2016
comment
о, стреляй! это должно быть self.activities, а не self.activity. как пользователь has_many, а не one действия. Я обновил ответ. Что касается перечислений.... Одним словом, это облегчает жизнь. :) - person x6iae; 30.01.2016
comment
ActionView::Template::Error (SQLite3::SQLException: нет такого столбца: activity.user_id: ВЫБЕРИТЕ действия.* ИЗ действий, ГДЕ activity.user_id = ? И activity.activity_type = ? ORDER BY activity.id ASC LIMIT 1): 9 : ‹%= current_user.setCommunity %› 10: ‹h4›‹%= current_user.activity_by_type(3) %›‹/h4› 11: ‹span›‹%= current_user.first_name %›‹/span› приложение/модели/ user.rb:9:in activity_by_type' app/views/activities/community_home.html.erb:10:in _app_views_activities_community_home_html_erb___3535737252128861255_70347348235740' - person javatar; 30.01.2016
comment
это интересно. поскольку у вас есть t.references :users в таблице миграции для действий. Вы можете подтвердить атрибуты объекта Activity? - person x6iae; 30.01.2016
comment
я могу подтвердить их в консоли рельсов, но не уверен, как это сделать в приложении на самом деле. - person javatar; 30.01.2016
comment
Да, в консоли. можете ли вы проверить, есть ли user_id на действиях - person x6iae; 30.01.2016
comment
Я вижу, что в таблице действий есть user_ids, если вы это имеете в виду? - person javatar; 30.01.2016
comment
хаа.. Я вижу это сейчас. это должно быть user_id, а не user_ids. проблема связана с вашей миграцией: t.references :users должно быть t.references :user. поэтому, чтобы решить эту проблему, создайте еще одну миграцию, чтобы изменить имя этого столбца с users на user, и это окончательно решит эту проблему. (короче говоря, убедитесь, что в таблице действий есть столбец user_id, а не столбец user_ids.) - person x6iae; 30.01.2016

Вам просто нужно запросить ассоциацию current_user.activities:

@activities = current_user.activites.where(activity_type: "1")

Вы также можете использовать scope (именно это рекомендуется SunnyK):

#app/models/user.rb
class User < ActiveRecord::Base
   has_many :activities
   scope :by_type, ->(type = 1) { activities.where(activity_type: type) }
end

--

Если вы хотите вернуть только одну запись, вам придется заменить .where с .find_by:

@activity = current_user.activities.find_by activity_type: 1

--

Поскольку вы используете enum, вы можете использовать встроенный метод класса, который вы сможете вызвать:

enum activity_type: [:sports, :photography]

@activity = current_user.activities.sports
person Richard Peck    schedule 30.01.2016
comment
Спасибо, Рич. Могу я просто спросить, где мне поставить @activity = current_user.activities.sports? я хочу в основном показать current_user.activities.sports.activity_name в моем представлении, но это не сработает, потому что он говорит неопределенный метод «имя_активности», хотя это атрибут активности - person javatar; 30.01.2016
comment
current_user.activities.sports возвращает коллекцию, поэтому вам придется сделать current_user.activites.sports.each do |sport| sport.activity_name end - person Richard Peck; 30.01.2016