假设您有以下型号:
class User < ActiveRecord::Base
has_many :comments, :as => :author
end
class Comment < ActiveRecord::Base
belongs_to :user
end
假设User有一个属性名称,Ruby / Rails中是否有任何方法可以使用表名和列来访问它,类似于您在select或where查询中输入的内容? 类似的东西:
Comment.includes(:author).first.send("users.name")
# or
Comment.first.send("comments.id")
编辑:我想要实现的是使用字符串访问模型对象的属性。对于简单的情况,我可以使用 object.send attribute_name ,但在访问“嵌套”属性(例如 Comment.author.name )时这不起作用。
基本上我想在where()和select()方法中使用ActiveRecord使用的类似sql的语法来检索模型属性,例如:
c = Comment.first
c.select("users.name") # should return the same as c.author.name
编辑2:更准确地说,我想解决以下问题:
obj = ANY_MODEL_OBJECT_HERE
# Extract the given columns from the object
columns = ["comments.id", "users.name"]
答案 0 :(得分:0)
我真的不明白你想要实现的目标。我发现您使用的是多态关联,在comment.user.name
模型中has_many :comments, :as => :author
时是否需要访问User
?
对于你的多态关联,你应该有
class Comment < ActiveRecord::Base
belongs_to :author, :polymorphic => true
end
如果你想访问comment.user.name
,你也可以
class Comment < ActiveRecord::Base
belongs_to :author, :polymorphic => true
belongs_to :user
end
class User < ActiveRecord::Base
has_many :comments, :as => :author
has_many :comments
end
请更具体地说明您的目标。
答案 1 :(得分:0)
我认为您正在寻找一种通过评论访问用户的方法。
让@comment
成为第一个评论:
@comment = Comment.first
要访问作者,您只需输入@comment.user
,如果您需要该用户的名称,则可以@comment.user.name
。它只是OOP。
如果您需要该评论的ID,则可以@comment.id
答案 2 :(得分:0)
因为user
和id
只是方法,所以你可以这样称呼它们:
comments.send('user').send('id')
或者,您可以随意构建查询:
Comment.includes(:users).where("#{User::columns[1]} = ?", @some_name)
但似乎你并没有真正想到Rails Way。我想你有理由。