从表+列名称中检索模型属性

时间:2012-06-25 12:38:51

标签: ruby-on-rails ruby activerecord

假设您有以下型号:

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"]

3 个答案:

答案 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)

因为userid只是方法,所以你可以这样称呼它们:

comments.send('user').send('id')

或者,您可以随意构建查询:

Comment.includes(:users).where("#{User::columns[1]} = ?", @some_name)

但似乎你并没有真正想到Rails Way。我想你有理由。