2011-03-19 50 views
9

Làm cách nào để thiết lập các tham số bổ sung trong has_many thông qua các liên kết?has_many thông qua các thuộc tính bổ sung

Cảm ơn. Neelesh

+0

chẳng hạn như thông số bổ sung nào? – s84

+1

Tôi đã có một bài đăng mẫu, một mô hình tham gia PostTag và một thẻ mô hình. Tôi muốn chỉ định ai đã tạo thẻ được liên kết cho bài đăng. – Neelesh

+0

@Sửa đổi mô hình kết hợp chính nó có khả năng có thể có các thuộc tính bổ sung ngoài id của hai đối tượng được liên kết. –

Trả lời

1
has_many :tags, :through => :post_tags, :conditions => ['tag.owner_id = ?' @owner.id] 
+3

Còn khi thực hiện thẻ << new_tag thì sao? – Neelesh

0

Có cùng một vấn đề ở đây. Không thể tìm thấy bất kỳ hướng dẫn nào để làm cho nó hoạt động nhanh chóng trên Rails 3. Nhưng bạn vẫn có thể nhận được những gì bạn muốn thông qua mô hình tham gia chính nó.

p = Post.new(:title => 'Post', :body => 'Lorem ipsum ...') 
t = Tag.new(:title => 'Tag') 

p.tags << t 
p.save # saves post, tag and also add record to posttags table, but additional attribute is NULL now 
j = PostTag.find_by_post_id_and_tag_id(p,t) 
j.user_id = params[:user_id] 
j.save # this finally saves additional attribute 

Rất xấu xí nhưng điều này làm việc từ tôi.

+0

Hình như nó sẽ hoạt động, nhưng có một cách neater, xem câu trả lời của tôi :) –

10

bài viết trên blog này có giải pháp hoàn hảo: http://www.tweetegy.com/2011/02/setting-join-table-attribute-has_many-through-association-in-rails-activerecord/

Đó giải pháp là: tạo của bạn ": thông qua mô hình" bằng tay, chứ không phải thông qua cách tự động khi bạn thêm vào mảng chủ sở hữu của hãng.

Sử dụng ví dụ từ bài đăng trên blog đó. Mô hình của bạn ở đâu:

class Product < ActiveRecord::Base 
    has_many :collaborators 
    has_many :users, :through => :collaborators 
end 

class User < ActiveRecord::Base 
    has_many :collaborators 
    has_many :products, :through => :collaborators 
end 

class Collaborator < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :user 
end 

Trước đây bạn có thể đã đi: product.collaborators << current_user.

Tuy nhiên, để thiết lập các tham số bổ sung (trong ví dụ này is_admin), chứ không phải là cách tự động phụ thêm vào mảng, bạn có thể làm nó bằng tay như:

product.save && product.collaborators.create(:user => current_user, :is_admin => true)

Cách tiếp cận này cho phép bạn đặt các đối số bổ sung tại thời điểm lưu. NB. product.save là cần thiết nếu mô hình chưa được lưu, nếu không mô hình đó có thể bị bỏ qua.

1

Tôi cũng ở trong tình huống tương tự, nơi tôi muốn có bảng tham gia tham gia 3 mô hình. Nhưng tôi muốn ID mẫu thứ ba được lấy từ mô hình thứ hai.

class Ingredient < ActiveRecord::Base 

end 

class Person < ActiveRecord::Base 
    has_many :food 
    has_many :ingredients_food_person 
    has_many :ingredients, through: :ingredients_food_person 
end 

class Food 
    belongs_to :person 
    has_many :ingredient_food_person 
    has_many :ingredients, through: :ingredients_food_person 

    before_save do 
    ingredients_food_person.each { |ifp| ifp.person_id = person_id } 
    end 
end 

class IngredientFoodPerson < ActiveRecord::Base 
    belongs_to :ingredient 
    belongs_to :food 
    belongs_to :person 
end 

Và đáng ngạc nhiên, bạn có thể làm một cái gì đó như thế này:

food = Food.new ingredients: [Ingredient.new, Ingredient.new] 
food.ingredients_food_person.size # => 2 
food.save 

Lúc đầu, tôi nghĩ rằng trước khi tôi lưu lại, tôi sẽ không có quyền truy cập vào #ingredients_food_person sau khi gán #ingredients. Nhưng nó tạo ra các mô hình tự động.

Các vấn đề liên quan