我有一个用户表和一个活动表。用户有很多活动。这就是我在用户表中的内容:
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 :(得分: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.
答案 1 :(得分: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