2016-01-30 4 views
1

У меня есть таблица пользователя и таблица действий. У пользователя много действий. Это то, что я имею в моей пользователей таблице:Запрос базы данных, передающей несколько параметров 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 

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

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

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

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

ответ

0

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

# 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>)

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

Один совет, который я дам, заключается в том, чтобы попытаться использовать the concept of enums, чтобы классифицировать столбец activity_type в таблице действий. Пример того, как, can be found here.

+0

Спасибо, но я, кажется, получаю сообщение об ошибке: undefined method 'activity' – javatar

+0

Можете ли вы сказать мне, где вы получаете эту ошибку? или полное сообщение об ошибке? Кроме того, я отредактировал свой ответ. можете ли вы перекрестно проверить, используете ли вы последнюю версию ответа? –

+0

Ниже ошибка из терминала: Завершено 500 Внутренняя ошибка сервера в 5мс (ActiveRecord: 0,1 мс) ActionView :: Template :: Error (неопределенный метод 'активность» для # <Пользователь: 0x007ff60f0c0348>): 8: 9:

<% = current_user.setCommunity%>

10:

<% = current_user.activity_by_type (1)%>

11: 12: 13: <% = current_user.first_name%> приложение/модели/user.rb: 9: в 'activity_by_type ' app/views/activities/community_home.html.erb: 10: in' _app_views_activities_community_home_html_erb___3535737252128861255_70347348235740' – javatar

0

Вы просто должны запросить на 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 
+0

Спасибо, Rich - могу я просто спросить, где я должен поставить @activity = current_user.activities.sports? Я хочу в основном показать current_user.activities.sports.activity_name в моем представлении, но это не сработает, потому что он говорит undefined method 'activity_name', хотя это атрибут активности – javatar

+0

'current_user.activities.sports' возвращает * коллекцию *, поэтому вам придется делать «current_user.activites.sports.each do | sport | sport.activity_name end' –