具有条件的ActiveRecord has_one在创建时不设置条件属性

时间:2013-10-27 08:17:00

标签: ruby-on-rails activerecord

使用Rails 3.2.11和ruby 1.9.3:

我有Review,User和ReviewAccess类

class ReviewAccess < ActiveRecord::Base
  belongs_to :user
  belongs_to :review
  attr_accessible :role_id
end

class Review < ActiveRecord::Base
  has_one :review_accesses_owner, :class_name => 'ReviewAccess',
    :conditions => "review_accesses.role_id = 1"
  has_one :owner, :class_name => 'User', :through => :review_accesses_owner,
   :source => :user
end

基本上,Review与用户是多对多的,而连接表是ReviewAccess,它还在role_id列中保存关系角色(所有者为1)。 我可以通过以下方式阅读评论所有者:

Review.owner  # works
# sql: SELECT "review_accesses".* FROM "review_accesses" WHERE "review_accesses"."review_id" = 7 AND (review_accesses.role_id = 1) LIMIT 1

但是,设置所有者不起作用,因为它没有将role_id设置为1(如关联的条件子句中所述)

Review.owner = current_user  # does not set role_id
# sql: INSERT INTO "review_accesses" ("created_at", "review_id", "role_id", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["created_at", Sun, 27 Oct 2013 08:02:54 UTC +00:00], ["review_id", 7], ["role_id", nil], ["updated_at", Sun, 27 Oct 2013 08:02:54 UTC +00:00], ["user_id", 1]]

我知道我可以覆盖所有者=但我有很多这些(对于每个角色)而我想要使用关联DSL。

如何更新具有条件的关联以设置创建条件?

1 个答案:

答案 0 :(得分:0)

我有点担心使用DSL它不是一个好选择。

  1. 如果您需要添加一些自定义行为,则首选覆盖访问者,而不是将代码放入回调中。
  2. 对于一些通用的重复方法,使用元编程的东西。如果你有很多角色,你的关联定义中仍然会有DRY,所以问题是相同的但是在不同的地方。
  3. 总结一下,使用元编程覆盖编写器。你拥有一系列角色的任何地方,对吗?